From 895962d781971d7eebb95acb0bc6ab39115dac7b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 22 May 2019 20:58:24 +0000 Subject: [PATCH] surface: Make only toplevels control events There is no need for popups to connect to the frame clock to pause and unpause events on the display - the toplevel already does it. And don't connect to paint either - handle paint on popups recursively. --- gdk/gdksurface.c | 62 +++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index 7db9f2cc8d..c48a3b0959 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -1371,9 +1371,8 @@ static void gdk_surface_paint_on_clock (GdkFrameClock *clock, void *data) { - GdkSurface *surface; - - surface = GDK_SURFACE (data); + GdkSurface *surface = GDK_SURFACE (data); + GList *l; g_return_if_fail (GDK_IS_SURFACE (surface)); @@ -1394,6 +1393,9 @@ gdk_surface_paint_on_clock (GdkFrameClock *clock, gdk_surface_remove_update_surface (surface); } + for (l = surface->children; l; l = l->next) + gdk_surface_paint_on_clock (clock, l->data); + g_object_unref (surface); } @@ -3725,34 +3727,40 @@ gdk_surface_set_frame_clock (GdkSurface *surface, if (clock) { g_object_ref (clock); - g_signal_connect (G_OBJECT (clock), - "flush-events", - G_CALLBACK (gdk_surface_flush_events), - surface); - g_signal_connect (G_OBJECT (clock), - "paint", - G_CALLBACK (gdk_surface_paint_on_clock), - surface); - g_signal_connect (G_OBJECT (clock), - "resume-events", - G_CALLBACK (gdk_surface_resume_events), - surface); + if (surface->parent == NULL) + { + g_signal_connect (G_OBJECT (clock), + "flush-events", + G_CALLBACK (gdk_surface_flush_events), + surface); + g_signal_connect (G_OBJECT (clock), + "resume-events", + G_CALLBACK (gdk_surface_resume_events), + surface); + g_signal_connect (G_OBJECT (clock), + "paint", + G_CALLBACK (gdk_surface_paint_on_clock), + surface); + } } if (surface->frame_clock) { - if (surface->frame_clock_events_paused) - gdk_surface_resume_events (surface->frame_clock, G_OBJECT (surface)); - - g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock), - G_CALLBACK (gdk_surface_flush_events), - surface); - g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock), - G_CALLBACK (gdk_surface_paint_on_clock), - surface); - g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock), - G_CALLBACK (gdk_surface_resume_events), - surface); + if (surface->parent == NULL) + { + if (surface->frame_clock_events_paused) + gdk_surface_resume_events (surface->frame_clock, G_OBJECT (surface)); + + g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock), + G_CALLBACK (gdk_surface_flush_events), + surface); + g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock), + G_CALLBACK (gdk_surface_resume_events), + surface); + g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock), + G_CALLBACK (gdk_surface_paint_on_clock), + surface); + } g_object_unref (surface->frame_clock); } -- 2.30.2